package aaa

import (
	"sync"

	"github.com/gorilla/websocket"
)

type Ws链接_广播 struct {
	链接表列 map[string][]*websocket.Conn
	锁列表  map[string][]*sync.RWMutex
	读写许可 *sync.RWMutex
}

func (类 *Ws链接_广播) C初始化() {
	类.链接表列 = make(map[string][]*websocket.Conn)
	类.锁列表 = make(map[string][]*sync.RWMutex)
	类.读写许可 = &sync.RWMutex{}
}

func (类 *Ws链接_广播) Z增加链接(方法名 string, 链接 *websocket.Conn) {
	类.读写许可.Lock()
	defer 类.读写许可.Unlock()

	// 初始化方法名的嵌套 map
	if _, ok := 类.链接表列[方法名]; !ok {
		类.链接表列[方法名] = []*websocket.Conn{}
	}
	if _, ok := 类.锁列表[方法名]; !ok {
		类.锁列表[方法名] = []*sync.RWMutex{}
	}

	// 检查链接是否已存在
	for _, v := range 类.链接表列[方法名] {
		if v == 链接 {
			return
		}
	}

	// 添加链接和锁
	类.链接表列[方法名] = append(类.链接表列[方法名], 链接)
	类.锁列表[方法名] = append(类.锁列表[方法名], &sync.RWMutex{})
	// 类.读写许可.Lock()
	// defer 类.读写许可.Unlock()
	// if 用户列表, ok := 类.链接表列[方法名]; ok {
	// 	for _, v := range 用户列表 {
	// 		if v == 链接 {
	// 			return
	// 		}
	// 	}
	// 	用户列表 = append(用户列表, 链接)
	// 	类.链接表列[方法名] = 用户列表
	// 	锁列表:=类.锁列表[方法名]
	// 	var 锁 sync.RWMutex
	// 	锁列表=append(锁列表, &锁)
	// 	类.锁列表[方法名]=锁列表

	// } else {
	// 	var 用户列表 = make([]*websocket.Conn, 1)
	// 	用户列表[0] = 链接
	// 	类.链接表列[方法名] = 用户列表

	// 	var 锁列表 = make([]*sync.RWMutex, 1)
	// 	var 锁 sync.RWMutex
	// 	锁列表[0]=&锁
	// 	类.锁列表[方法名]=锁列表
	// }
}

func (类 *Ws链接_广播) S删链接(方法名 string, 链接 *websocket.Conn) {
	类.读写许可.Lock()
	defer 类.读写许可.Unlock()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			if v == 链接 {
				// 用户列表 = append(用户列表[:i], 用户列表[i+1:]...)
				// 类.链接表列[方法名] = 用户列表

				// 锁表:=类.锁列表[方法名]
				// 锁表 = append(锁表[:i], 锁表[i+1:]...)
				// 类.锁列表[方法名]=锁表
				// return
				// 删除链接和对应的锁
				类.链接表列[方法名] = append(用户列表[:i], 用户列表[i+1:]...)
				锁 := 类.锁列表[方法名][i]
				锁.Lock()
				锁.Unlock()
				类.锁列表[方法名] = append(类.锁列表[方法名][:i], 类.锁列表[方法名][i+1:]...)
				break
			}
		}
	}

}

func (类 *Ws链接_广播) T推送消息_文本(方法名 string, 消息 string) {
	类.读写许可.RLock()
	defer 类.读写许可.RUnlock()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			锁 := 类.锁列表[方法名][i]
			go 推送消息(v, 锁, 消息)
			//go v.WriteMessage(websocket.TextMessage, []byte(消息))

		}
	}

}

func (类 *Ws链接_广播) T推送消息_方法推文本(方法名 string, 消息方法 func() string) {
	类.读写许可.RLock()
	defer 类.读写许可.RUnlock()
	发送消息 := 消息方法()
	if 用户列表, ok := 类.链接表列[方法名]; ok {
		for i, v := range 用户列表 {
			锁 := 类.锁列表[方法名][i]
			go 推送消息(v, 锁, 发送消息)
			//go v.WriteMessage(websocket.TextMessage, []byte(发送消息))

		}
	}

}
